﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
using namespace std;
/*继承*/
//class person
//{
//public:
//	person(const char* name = "xiaoming")
//		:_name(name)
//	{
//		cout << "person(const char* name = xiaoming)" << endl;
//	}
//	person(const person& s)
//		:_name(s._name)
//	{
//		cout << "person(const person& s )" << endl;
//	}
//
//	person& operator=(const person& s)
//	{
//		cout <<" person & operator=(const person & s)" << endl;
//		if (this != &s)
//		{
//			_name =s._name;
//		}
//		return *this;
//	}
//	~person()
//	{
//		cout << "~person" << endl;
//	}
//	void pp()
//	{
//		cout << "person" << endl;
//	}
//public:
//	string _name;
//	int _age = 10;
//	static int _a;//static对象在类外声明，为所有对象所使用
//};
//int person::_a = 5;
//class teacher :public person
//{
//public:
//	teacher(int id,const char* name)
//		:person(name)
//	{
//		_id = id;
//		cout << _name << endl;
//	}
//	teacher(const teacher& s)
//		:person(s)
//		,_id(s._id)
//	{
//		cout << _id<<_name << endl;
//	}
//
//	teacher& operator=(const teacher& s)
//	{
//		cout << " teacher& operator=(const teacher& s)" << endl;
//		if (this != &s)
//		{
//			person::operator=(s);
//			_name = s._id;
//		}
//		return *this;
//	}
//	~teacher()
//	{
//		//person::~person();
//		cout << "~teacher" << endl;
//		//自动调用父类的析构函数/* 析构函数是编译器进行特殊处理的虚函数，都会被命名为destoried(),因此继承时最好加上virtual*/
//	}
//	void p()
//	{
//		cout << "teacher" << endl;
//	}
//private:
//	int _id = 10;
//};

//class A
//{
//	A() { cout << "A::A()" << endl; }
//
//	~A() { cout << "A::~A()" << endl; }
//
//	int a;
//};






//int main()
//
//{
//	teacher b(10,"lll");
//	teacher c(b);
//
//	teacher c = b;
//	teacher d(c);
//}

//int main()
//{
//	techer a = techer();
//	a.p();
//	a.pp();
//	//继承默认不写，会进行private。
//}

/*多继承--菱形继承出现的问题,会产生二义性，在腰上加入关键字virtual解决*/
//class A
//{
//public:
//	A()
//	{
//		cout << "A()" << endl;
//	}
//	void text()
//	{
//		cout << "Atext()" << endl;
//	}
//private:
//	int _name;
//};
//
//class B : virtual public A
//{
//public:
//	B()
//	{
//		cout << "B()" << endl;
//	}
//	void text()
//	{
//		cout << "Btext()" << endl;
//	}
//private:
//	string _age;
//};
//
//
//
//class C :virtual public A
//{
//public:
//	C()
//	{
//		cout << "C()" << endl;
//	}
//	void text()
//	{
//		cout << "Ctext()" << endl;
//	}
//private:
//	string _id;
//};
//
//class D :public B,public C
//{
//public:
//	D()
//	{
//		cout << "D()" << endl;
//	}
//	void text()
//	{
//		cout << "Dtext()" << endl;
//	}
//private:
//	int _b;
//};
//
//int main()
//{
//	D a;
//	a.text();
//}

/*多态->不同对象调用的函数行为不同*/
//class person
//{
//public:
//	person(int a = 10)
//		:_a(a)
//	{
//		cout << "person(int a = 10)" << endl;
//	}
//	virtual void buyticket()
//	{
//		cout << "全票" << _a << endl;
//	}
//	virtual ~person()
//	{
//		cout << "~person()" << endl;
//	}
//private:
//	int _a;
//};
//
//class children : public person
//{
//public:
//	children(int b = 5)
//		:_b(b)
//	{
//		cout << "children(int b = 5)" << endl;
//	}
//	virtual void buyticket()
//	{
//		cout << "半票" << _b << endl;
//	}
//	virtual ~children()
//	{
//		cout << "~children()" << endl;
//	}
//private:
//	int _b;
//};
//
//int main()
//{
//	//多态利用
//	person* p = new children();
//	p->buyticket();
//	delete p;
//	p = nullptr;
//	person a;
//	children c;
//	a.buyticket();
//	person* pp = new person();
//	pp->buyticket();
//	delete pp;

//}

//抽象类
//class car
//{
//public:
//	/*纯虚函数*/
//	virtual void brand() = 0
//	{
//		cout << "...." << endl;
//	}
//};
//class BMW :public car
//{
//	virtual void brand()
//	{
//		cout << "舒服" << endl;
//	}
//};
//
//class A
//{
//public:
//	virtual void f()
//	{
//		cout << "A::f()" << endl;
//	}
//};
//
//class B : public A
//{
//private:
//	virtual void f()
//	{
//		cout << "B::f()" << endl;
//	}
//};
//
//
//int main()
//{
//	//car b;
//	/*抽象类不能实例化对象，强制子类必须重写父类的纯虚函数*/
//	/*car* A = new BMW();
//	A->brand();*/
//	A* pa = new B;
//	B a;
//	/*多态可以访问*/
////	a.f();/*private在类外不能访问 */
//	pa->f();
//	return 0;
//}


class A
{
public:
	virtual void text()
	{
		cout << "A..." << endl;
	}
private:
	int _a = 0;
};

class B:public A
{
public:
	virtual void text()
	{
		cout << "B..." << endl;
	}
private:
	int _b = 10;
};
int main()
{
	B b;
	A a;
	return 0;
}